package br.senai.sc.controller;

import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseId;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;

import br.senai.sc.dao.GenericDAOImp;
import br.senai.sc.entity.Edital;
import br.senai.sc.entity.Imagem;
import br.senai.sc.entity.Lance;
import br.senai.sc.entity.ProdutoServico;
import br.senai.sc.util.SessionObjectDestroyer;

@ManagedBean
@SessionScoped
public class EditalController implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Edital edital;
	private ProdutoServico produtoServico;
	private Imagem imagem;
	private StreamedContent image;
	private GenericDAOImp<?, ?> dao;
	private List<ProdutoServico> produtosServicos;
	private List<Edital> editais;
	private Edital editalSelecionado;
	private List<Edital> editaisTela;
	private List<ProdutoServico> psEditar;
	private String searchString;

	@PostConstruct
	public void init() {
		if (editais == null || editais.isEmpty() || editaisTela == null
				|| editaisTela.isEmpty()) {
			editais = dao.listAll(Edital.class);
			editaisTela = editais;
		}
	}

	public List<ProdutoServico> getPsEditar() {
		return psEditar;
	}

	public void setPsEditar(List<ProdutoServico> psEditar) {
		this.psEditar = psEditar;
	}

	public String getSearchString() {
		return searchString;
	}

	public void setSearchString(String searchString) {
		this.searchString = searchString;
	}

	public List<ProdutoServico> getPseditar() {
		psEditar = dao.listAllByProperty(ProdutoServico.class, "ativo", true);
		if (psEditar == null || psEditar.isEmpty()) {
			psEditar = new ArrayList<>();
		}
		if (!psEditar.contains(edital.getProdutoServico())) {
			psEditar.add(edital.getProdutoServico());
		}

		return psEditar;
	}

	public void setPseditar(List<ProdutoServico> pseditar) {
		this.psEditar = pseditar;
	}

	public Edital getEditalSelecionado() {
		return editalSelecionado;
	}

	public void setEditalSelecionado(Edital editalSelecionado) {
		this.editalSelecionado = editalSelecionado;
	}

	public List<Edital> getEditais() {
		editais = dao.listAllByProperty(Edital.class, "ativo", true);
		return editais;
	}

	public void setEditais(List<Edital> editais) {
		this.editais = editais;
	}

	public GenericDAOImp<?, ?> getDao() {
		return dao;
	}

	public void setDao(GenericDAOImp<?, ?> dao) {
		this.dao = dao;
	}

	public List<ProdutoServico> getProdutosServicos() {
		produtosServicos = dao.listAllByProperty(ProdutoServico.class, "ativo",
				true);
		return produtosServicos;
	}

	public void setProdutosServicos(List<ProdutoServico> ps) {
		this.produtosServicos = ps;
	}

	public Edital getEdital() {
		return edital;
	}

	public void setEdital(Edital edital) {
		this.edital = edital;
	}

	public ProdutoServico getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(ProdutoServico produtoServico) {
		this.produtoServico = produtoServico;
	}

	public Imagem getImagem() {
		return imagem;
	}

	public void setImagem(Imagem imagem) {
		this.imagem = imagem;
	}

	public StreamedContent getImage() {
		return image;

	}

	public List<Edital> getEditaisTela() {
		return editaisTela;
	}

	public void setEditaisTela(List<Edital> editaisTela) {
		this.editaisTela = editaisTela;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public String retornaHome() {
		editaisTela = dao.listAll(Edital.class);
		searchString = "";
		return "/index?faces-redirect=true";
	}

	public StreamedContent retornaImagem() {
		FacesContext context = FacesContext.getCurrentInstance();
		if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
			// So, we're rendering the view. Return a stub StreamedContent so
			// that it will generate right URL.
			return new DefaultStreamedContent();
		} else {
			String id = context.getExternalContext().getRequestParameterMap()
					.get("id");
			edital = dao.listByProperty(Edital.class, "id", id);
			produtoServico = edital.getProdutoServico();
			imagem = (Imagem) dao.listByProperty(Imagem.class,
					"produtoServico", produtoServico);
			image = new DefaultStreamedContent(new ByteArrayInputStream(
					imagem.getImagem()), "image/png");
			return image;
		}
	}

	public void setImage(StreamedContent image) {
		this.image = image;
	}

	public String buscaEdital() {
		editaisTela = dao.listAllByProperty(Edital.class, "titulo", "%"
				+ searchString.concat("%"));
		return "/index";
	}

	@SuppressWarnings("rawtypes")
	public EditalController() {
		produtoServico = new ProdutoServico();
		dao = new GenericDAOImp();
		edital = new Edital();
		this.imagem = new Imagem();
	}

	public void setProdutosServicos() {
		produtosServicos = dao.listAllByProperty(ProdutoServico.class, "ativo",
				true);
	}

	public String salvarEdital() {
		edital.setAtivo(true);
		if (edital.getId() == null) {
			edital.setProdutoServico(produtoServico);
			dao.create(edital);
		} else {
			edital.setProdutoServico(produtoServico);
			dao.merge(edital);
		}
		produtoServico.setAtivo(false);
		dao.merge(produtoServico);
		edital = new Edital();
		SessionObjectDestroyer.destroy();
		return "/index";
	}

	public String cancelarEdital() {
		init();
		return "/index?faces-redirect=true";
	}

	public String editarEdital(Edital edital) {
		this.edital = edital;
		return "/pages/edital/editaredital";
	}

	public void removerEdital() {
		if (dao.listAllByProperty(Lance.class, "edital", editalSelecionado) != null) {
			FacesContext.getCurrentInstance()
					.addMessage(
							"Erro ao excluir edital!",
							new FacesMessage(FacesMessage.SEVERITY_ERROR,
									"Erro ao exluir edital!",
									"Edital já possui lances"));
		} else {

			editalSelecionado.setAtivo(false);
			produtoServico = editalSelecionado.getProdutoServico();
			produtoServico.setAtivo(true);
			dao.merge(produtoServico);
			editalSelecionado.setProdutoServico(null);
			dao.delete(editalSelecionado);
			editais = null;
		}
	}
}
